/*************************************************************************
    > File Name    : TaskQueue.cc
    > Author       : LiuLei
    > Mail         : 2261459486@qq.com 
    > Created Time : 2022年11月24日 星期四 20时52分49秒
 ************************************************************************/

#include "../../include/server/TaskQueue.h"
#include "../../include/server/MutexLockGuard.h"

TaskQueue::TaskQueue(size_t queueSize)
: _queueSize(queueSize)
, _queue()
, _mutex()
, _notFull(_mutex)
, _notEmpty(_mutex)
, _isExistTP(true)
{

}

TaskQueue::~TaskQueue()
{
    
}

bool TaskQueue::empty()
{
    return 0 == _queue.size();
}

bool TaskQueue::full()
{
    return _queueSize == _queue.size();
}

void TaskQueue::push(const ElemType &value)
{
    MutexLockGuard autoLock(_mutex);

    while(full())
    {
        _notFull.wait();
    }

    _queue.push(std::move(value));

    _notEmpty.notify();
}

void TaskQueue::push(ElemType &&value)
{
    MutexLockGuard autoLock(_mutex);

    while(full())
    {
        _notFull.wait();
    }

    _queue.push(std::move(value));

    _notEmpty.notify();
}

ElemType TaskQueue::pop()
{
    MutexLockGuard autoLock(_mutex);

    while(_isExistTP && empty())
    {
        _notEmpty.wait();
    }

    if(_isExistTP)
    {
        ElemType tmp = _queue.front();
        _queue.pop();

        _notFull.notify();

        return tmp;
    }
    else
    {
        return nullptr;
    }
}

void TaskQueue::weakup()
{
    _isExistTP = false;
    _notEmpty.notifyAll();
}
